﻿#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
/*
原子性​：一个操作或一系列操作要么完全执行，要么完全不执行，中间状态不可见
原子操作：计算机硬件和编译器共同保证的“不可分割”操作——执行时不会被线程切换打断
		 也不会被其他线程看到中间状态，从而天然防止多线程冲突

原子操作本质就是线程安全操作

std::atomic是C++11标准库中的一个模板类，用于实现多线程环境下的原子操作
它提供了一种线程安全的方式来访问和修改共享变量，可以避免多线程环境中的数据竞争问题。

std::atomic的使用方式类似于普通的C++变量，具有线程安全性
一般用于基本变量(int,bool等)，不适合复杂变量类型，但效率比互斥锁高

以下是一些常用的atomic操作(都具有线程安全性)：
1.load()：将atomic变量的值加载到当前线程的本地缓存中，并返回这个值。
2.store(val)将val的值存储到atomic变量中，并保证这个操作是原子性的。
3.exchange(val) ：将val的值存储到std::atomic变量中，并返回原先的值。
4.compare_exchange_weak(expected, val)和compare_exchange_strong(expected, val) 
比较atomic变量的值和expected的值是否相同，如果相同则将val的值存储到atomic变量中
并将expected更新为atomic变量的旧值，然后返回true
如果不相同，则将atomic变量的值加载到expected中，并返回false 。
优先使用 weak​​:在循环中使用,实现无锁算法,性能敏感场景
​​使用strong:需要单次尝试,不能容忍伪失败,代码清晰性优先
*/
std::atomic<int> shared_data(0); //automic<int> a=0;
void func12() {
	for (int i = 0; i < 100000; ++i) {
		shared_data++;
	}
}

int main31() {
	thread t1(func12);
	thread t2(func12);

	t1.join();
	t2.join();

	cout << "Final1 shared_data = " << shared_data.load() << endl;
	shared_data.store(0);
	cout << "change：" << shared_data.exchange(666) << endl;
	cout << "Final2 shared_data = " << shared_data.load() << endl;
	return 0;
}